package com.zzyl.nursing.service.impl;

import java.time.LocalDateTime;
import java.util.List;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.zzyl.common.utils.DateUtils;
import com.zzyl.nursing.dto.ReservationDto;
import com.zzyl.nursing.dto.TimeCountDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zzyl.nursing.mapper.ReservationMapper;
import com.zzyl.nursing.domain.Reservation;
import com.zzyl.nursing.service.IReservationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.Arrays;

/**
 * 预约信息Service业务层处理
 *
 * @author ruoyi
 * @date 2025-07-31
 */
@Service
public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reservation> implements IReservationService {
    @Autowired
    private ReservationMapper reservationMapper;

    /**
     * 查询预约信息
     *
     * @param id 预约信息主键
     * @return 预约信息
     */
    @Override
    public Reservation selectReservationById(Long id) {
        return getById(id);
    }

    /**
     * 查询预约信息列表
     *
     * @param reservation 预约信息
     * @return 预约信息
     */
    @Override
    public List<Reservation> selectReservationList(Reservation reservation) {
        return reservationMapper.selectReservationList(reservation);
    }

    /**
     * 新增预约信息
     *
     * @param dto 预约信息
     * @return 结果
     */
    @Override
    public boolean add(ReservationDto dto) {
        // 检查该时间段是否还有预约名额
        LocalDateTime time = dto.getTime();
        if (time != null) {
            LocalDateTime startTime = time.toLocalDate().atStartOfDay();
            LocalDateTime endTime = startTime.plusDays(1);

            List<TimeCountDto> timeCounts = reservationMapper.selectReservationCountByTime(startTime, endTime);
            for (TimeCountDto timeCount : timeCounts) {
                // 如果是当前预约的时间段且剩余次数为0，则不允许预约
                if (timeCount.getTime().equals(time) && timeCount.getCount() <= 0) {
                    throw new RuntimeException("该时间段预约已满，请选择其他时间段");
                }
            }
        }
        //封装数据
        Reservation reservation = BeanUtil.toBean(dto, Reservation.class);
        return save(reservation);
    }

    /**
     * 修改预约信息
     *
     * @param reservation 预约信息
     * @return 结果
     */
    @Override
    public int updateReservation(Reservation reservation) {
        return updateById(reservation) ? 1 : 0;
    }

    /**
     * 批量删除预约信息
     *
     * @param ids 需要删除的预约信息主键
     * @return 结果
     */
    @Override
    public int deleteReservationByIds(Long[] ids) {
        return removeByIds(Arrays.asList(ids)) ? 1 : 0;
    }

    /**
     * 删除预约信息信息
     *
     * @param id 预约信息主键
     * @return 结果
     */
    @Override
    public int deleteReservationById(Long id) {
        return removeById(id) ? 1 : 0;
    }

    /**
     * 查询用户当天取消预约数量
     *
     * @param userId 用户ID
     * @return 取消预约数量
     */
    @Override
    public int selectCancelledReservationCountByUserId(Long userId) {
        //获取当前系统时间的毫秒数（从1970年1月1日00:00:00 GMT开始计算的毫秒数）
        long time = System.currentTimeMillis();
        /*使用Hutool工具类的LocalDateTimeUtil.of(time)将毫秒数转换为LocalDateTime对象
        调用toLocalDate()获取日期部分（不包含时间）
        调用atStartOfDay()将时间设置为当天的开始时间（00:00:00）
        例如：如果当前时间是2023-03-10 14:30:00，那么startTime就是2023-03-10 00:00:00*/
        LocalDateTime startTime = LocalDateTimeUtil.of(time).toLocalDate().atStartOfDay();
        /*在开始时间的基础上加上1天，得到第二天的开始时间
            例如：如果startTime是2023-03-10 00:00:00，那么endTime就是2023-03-11 00:00:00*/
        LocalDateTime endTime = startTime.plusDays(1);

        return reservationMapper.selectCancelledReservationCountByUserIdAndTime(userId, startTime, endTime);
    }

    /**
     * 查询每个时间段剩余预约次数
     *
     * @return 时间段及剩余次数列表
     */
    @Override
    public List<TimeCountDto> selectReservationCountByTime() {
        long time = System.currentTimeMillis();
        LocalDateTime startTime = LocalDateTimeUtil.of(time).toLocalDate().atStartOfDay();
        LocalDateTime endTime = startTime.plusDays(1);

        return reservationMapper.selectReservationCountByTime(startTime, endTime);
    }

    /**
     * 取消预约
     *
     * @param id 预约信息主键
     * @return 结果
     */
    @Override
    public boolean cancelReservation(Long id) {
        Reservation reservation = getById(id);
        if (reservation == null) {
            throw new RuntimeException("预约信息不存在");
        }

        // 设置预约状态为取消（状态码2）
        reservation.setStatus(2);
        return updateById(reservation);
    }











}
